/*
 * Copyright (C) 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.smartandroid.sa.json;

import java.io.IOException;

import com.smartandroid.sa.json.internal.$Gson$Preconditions;

/**
 * A simple implementation of the {@link JsonElementVisitor} that simply
 * delegates the method invocation onto a {@code delegate} instance of the
 * {@link JsonElementVisitor}. This object can be used to build a chain of
 * visitors such that each Visitor instance can perform some operation on the
 * {@link JsonElement} and then pass on the input to the delegate. This kind of
 * pattern is sometimes referred as a "Chain of Responsibility".
 * 
 * <p>
 * The following is an example use case:
 * 
 * <pre>
 * class JsonEscapingVisitor extends DelegatingJsonElementVisitor {
 *   public JsonEscapingVisitor(JsonElementVisitor) {
 *     super(visitor);
 *   }
 * 
 *   public void visitPrimitive(JsonPrimitive primitive) {
 *     JsonPrimitive escapedPrimitive = escapePrimitiveObject(primitive);
 *     super.visitPrimitive(escapedPrimitive);
 *   }
 * }
 * 
 * JsonElementVisitor visitor = new JsonEscapingVisitor(new FormattingVisitor());
 * </pre>
 * 
 * </p>
 * 
 * @author Joel Leitch
 */
final class DelegatingJsonElementVisitor implements JsonElementVisitor {
	private final JsonElementVisitor delegate;

	protected DelegatingJsonElementVisitor(JsonElementVisitor delegate) {
		this.delegate = $Gson$Preconditions.checkNotNull(delegate);
	}

	public void endArray(JsonArray array) throws IOException {
		delegate.endArray(array);
	}

	public void endObject(JsonObject object) throws IOException {
		delegate.endObject(object);
	}

	public void startArray(JsonArray array) throws IOException {
		delegate.startArray(array);
	}

	public void startObject(JsonObject object) throws IOException {
		delegate.startObject(object);
	}

	public void visitArrayMember(JsonArray parent, JsonPrimitive member,
			boolean isFirst) throws IOException {
		delegate.visitArrayMember(parent, member, isFirst);
	}

	public void visitArrayMember(JsonArray parent, JsonArray member,
			boolean isFirst) throws IOException {
		delegate.visitArrayMember(parent, member, isFirst);
	}

	public void visitArrayMember(JsonArray parent, JsonObject member,
			boolean isFirst) throws IOException {
		delegate.visitArrayMember(parent, member, isFirst);
	}

	public void visitObjectMember(JsonObject parent, String memberName,
			JsonPrimitive member, boolean isFirst) throws IOException {
		delegate.visitObjectMember(parent, memberName, member, isFirst);
	}

	public void visitObjectMember(JsonObject parent, String memberName,
			JsonArray member, boolean isFirst) throws IOException {
		delegate.visitObjectMember(parent, memberName, member, isFirst);
	}

	public void visitObjectMember(JsonObject parent, String memberName,
			JsonObject member, boolean isFirst) throws IOException {
		delegate.visitObjectMember(parent, memberName, member, isFirst);
	}

	public void visitNullObjectMember(JsonObject parent, String memberName,
			boolean isFirst) throws IOException {
		delegate.visitNullObjectMember(parent, memberName, isFirst);
	}

	public void visitPrimitive(JsonPrimitive primitive) throws IOException {
		delegate.visitPrimitive(primitive);
	}

	public void visitNull() throws IOException {
		delegate.visitNull();
	}

	public void visitNullArrayMember(JsonArray parent, boolean isFirst)
			throws IOException {
		delegate.visitNullArrayMember(parent, isFirst);
	}
}
